package com.b1.taskmanagerserver.api;

import com.b1.taskmanagerserver.parser.TaskXml;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.ListIterator;
import org.apache.log4j.Category;
import org.apache.log4j.Logger;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;

/**
 * Реализация интрефейса TaskListInterface
 *
 * класс работы со списком задач
 */
public class TaskList extends java.util.Observable implements TaskListInterface 
{
    private static final Logger log = Logger.getLogger(TaskList.class);
    private List<Task> taskList;        // список задач

    /**
     * конструктор класса
     * инициализирует список задач
     * и обеспечивает загрузку данных в него из файла
     */
    public TaskList() 
    {
            taskList = new ArrayList<Task>();
            taskList = load();
    }    
    
     /**
     * метод возвращения списка задач
     * @return 
     */
    public List<Task> getTaskList() {
        return taskList;
    }

    /**
     * метод присваивания значения списку задач
     * @param taskList
     */
    public void setTaskList(List<Task> taskList) {
        this.taskList = taskList;
    }
    /**
     * возращение всех задач,хранящихся в taskList в виде строки
     * @return 
     */
    public String showTaskList()
    {
        StringBuffer str = new StringBuffer();
        for (int i = 0; i < taskList.size(); i++)
            str.append(i+"\t"+taskList.get(i).showField()+"\n");
        return str.toString();
    }
    /**
     * вывод описания задачи из списка по ее id
     * @param id
     * @return String
     */
    public String showTask(int id)
    {
        StringBuffer str = new StringBuffer();
        for (ListIterator<Task> i = taskList.listIterator(); i.hasNext();) 
        {
            Task ts = i.next();
            if (ts.getId() == id) 
            {
                str.append("Begin: "+ts.getBeginDate()+"\nEnd: "+ts.getEndDate()
                        +"\nTitle: "+ ts.getTitle()+"\nType: "+ts.getType());
                if(ts.getType().equals("meeting")) str.append("\nPlace: "+ts.getPlace());
                str.append("\nContacts: ");
                ContactList contactList = new ContactList();
                for (ListIterator<Contact> j = ts.getContactList().listIterator(); j.hasNext();) 
                {
                    Contact ct = contactList.getContactByNumber(j.next().getId());
                    str.append(ct.getLastName()+" "+ct.getFirstName()+"\n"+ct.getHomePhone()+"\n");
                }
                str.append("Description: "+ts.getDescription());
                break;
            }
        }
        return str.toString();
    }
    /**
     * получение задачи из списка по id
     * @param id
     * @return Task
     */
    public Task getTaskByNumber(int id)
    {
        for (ListIterator<Task> i = taskList.listIterator(); i.hasNext();) {
            Task ts = i.next();
            if (ts.getId() == id) {
                return ts;
            }
        }
        log.warn("No found Task");
        return null;   
    }
    
    /**
     * ДОбавление задачи в список
     * @param beginDate
     * @param title 
     */
    @Override
    public void addTask(Date beginDate, String title)  //добавление
    {
        addTask(beginDate,null,title,"","memo","-",null);
    }
    /**
     * ДОбавление задачи в список
     * @param beginDate
     * @param endDate
     * @param title
     * @param discription
     * @param type
     * @param place
     * @param contacts 
     */
    public void addTask(Date beginDate, Date endDate, String title,String discription, String type, String place, Contact contacts)  //добавление
    {
        Task newTask = new Task((int)System.currentTimeMillis());
        newTask.setBeginDate(beginDate);
        newTask.setEndDate(endDate);
        newTask.setTitle(title);
        newTask.setDescription(discription);
        newTask.setType(type);
        newTask.setPlace(place);
        newTask.addContactToList(contacts);
        taskList.add(newTask);
        save();
    }
    
    /**
     * удаление задачи из списка по id
     * @param id
     * @return 
     */
    @Override
    public boolean delTask(int id)                             //удаление 
    {
        for (ListIterator<Task> i = taskList.listIterator(); i.hasNext();) {
            Task ts = i.next();
            if (ts.getId() == id) 
            {
                i.remove(); 
                break;
            }
        }
        save();
        return true;
    }
    /**
     *  метод изменения task в списке по id
     * @param id
     * @param beginDate
     * @param endDate
     * @param title
     * @param type
     * @param description
     * @param place
     * @param contact
     * @return 
     */
    @Override
    public boolean cahngeTask(int id,Date beginDate,Date endDate, String title, String type,String description, String place,List<Contact> contact)                          //изменение 
    {
        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd.MM.yyyy");
        for (ListIterator<Task> i = taskList.listIterator(); i.hasNext();) {
            Task ts = i.next();
            if (ts.getId() == id) 
            {
                ts.setBeginDate(beginDate);
                ts.setEndDate(endDate);
                ts.setTitle(title);
                ts.setType(type);
                ts.setDescription(description);
                ts.setPlace(place);
                ts.setContactList(contact);
                save();
                break;
            }
        }
        return true;
    }
    
    /**
     * 
     * Сохранение задач из taskList в xml файл
     * @return 
     *
     */
    @Override
    public boolean save()                           //сохранение списка
    {
        TaskXml tx;
        try 
        {
            tx = new TaskXml();
            tx.writeXml(listToString());
        } 
        catch (IOException ex) 
        {
            log.warn(TaskList.class.getName(),ex);
        } 
        catch (SAXException ex) 
        {
            log.warn(TaskList.class.getName(),ex);
        } 
        catch (ParserConfigurationException ex) 
        {
            log.warn(TaskList.class.getName(),ex);
        }
        return true;
    }
    /**
     * Загрузка задач из xml файла
     * и добавление их в taskList
     * @return 
     */
    @Override
    public List<Task> load()
    {
     try 
        {
            TaskXml contactFile = new TaskXml();
            String taskArray [][] = contactFile.getTaskArray();
            Task task;
            List<Contact> contacts = new ArrayList<Contact>();
            for (int i = 0; i < taskArray.length; i++) 
            {
                java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("HH:mm dd-MM-yyyy");
                task = new Task(Integer.parseInt(taskArray[i][0]),sdf.parse(taskArray[i][1]),taskArray[i][3]);
                task.setEndDate(sdf.parse(taskArray[i][2])); 
                String[] idContacts = taskArray[i][6].split(" ");
                Contact ct = new Contact(Integer.parseInt(taskArray[i][6]));
                task.addContactToList(ct); 
                task.setType(taskArray[i][4]);
                task.setPlace(taskArray[i][5]);
                task.setDescription(taskArray[i][7]);
                taskList.add(task);
            }
        } 
        catch (java.text.ParseException ex) 
        {
            log.warn(TaskList.class.getName(),ex);
        }
        catch (IOException ex) 
        {
            log.warn(TaskList.class.getName(),ex);
        } 
        catch (SAXException ex) 
        {
            log.warn(TaskList.class.getName(),ex);
        } 
        catch (ParserConfigurationException ex) 
        {
            log.warn(TaskList.class.getName(),ex);
        }
        return taskList;
    }
    
    /**
     * Возвращение taskList в виде String[length][8]
     * length - количество записей в листе задач
     * @return String [][]
     */
    public String[][] listToString()
    {
        String[][] s = new String[taskList.size()][8];
        java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("HH:mm dd-MM-yyyy");
        for(int i = 0; i<taskList.size();i++)
        {

            Task task = taskList.listIterator(i).next();
            s[i][0] = String.valueOf(task.getId());
            s[i][1] = df.format(task.getBeginDate());
            s[i][2] = df.format(task.getEndDate());
            s[i][3] = task.getTitle();
            s[i][4] = task.getType();
            s[i][5] = task.getPlace();
            s[i][6] = task.getContactIdToString();
            s[i][7] = task.getDescription();
       }
        return s;
    }
}
